/*
 * To change this template, choose Tools | Templates and open the template in
 * the editor.
 */
package com.wordpress.salaboy.emergencyservice.worldui.slick.graphicable;

import com.wordpress.salaboy.context.tracking.ContextTrackingProvider;
import com.wordpress.salaboy.model.*;
import org.newdawn.slick.Animation;
import org.newdawn.slick.geom.Polygon;
import com.wordpress.salaboy.model.Emergency.EmergencyType;
import com.wordpress.salaboy.model.persistence.PersistenceServiceProvider;

/**
 *
 * @author salaboy
 */
public class GraphicableFactory {

    private static int[] xs = new int[]{1, 7, 13, 19, 25, 31, 37};
    private static int[] ys = new int[]{1, 7, 13, 19, 25};

    public static GraphicableVehicle newVehicle(Vehicle vehicle) {
        if (vehicle instanceof Ambulance) {
            return newAmbulance((Ambulance) vehicle);
        } else if (vehicle instanceof FireTruck) {
            return newFireTruck((FireTruck) vehicle);
        } else if (vehicle instanceof PoliceCar) {
            return newPoliceCar((PoliceCar) vehicle);
        }

        throw new IllegalArgumentException("Unknown Vehicle Type: " + vehicle.getClass().getName());
    }

    public static GraphicableAmbulance newAmbulance(Ambulance ambulance) {
        GraphicableAmbulance graphAmbulance = new GraphicableAmbulance(ambulance);

        Animation myAmbulance = AnimationFactory.getAmbulanceAnimation().copy();
        EmergencyEntityBuilding central = CityEntities.buildings.get("911");
        Polygon myPolygon = new Polygon(new float[]{
                    (central.getX() * 16), central.getY() * 16,
                    (central.getX() * 16) + 28, (central.getY() * 16),
                    (central.getX() * 16) + 28, (central.getY() * 16) + 28,
                    (central.getX() * 16), (central.getY() * 16) + 28
                });
        graphAmbulance.setAnimation(myAmbulance);
        graphAmbulance.setPolygon(myPolygon);

        return graphAmbulance;
    }

    public static GraphicableFireTruck newFireTruck(FireTruck fireTruck) {
        GraphicableFireTruck graphFireTruck = new GraphicableFireTruck(fireTruck);

        Animation myFireTruck = AnimationFactory.getFireTruckAnimation().copy();
        EmergencyEntityBuilding firefighters = CityEntities.buildings.get("Firefighters Department");
        Polygon myPolygon = new Polygon(new float[]{
                    firefighters.getX() * 16, firefighters.getY() * 16,
                    (firefighters.getX() * 16) + 28, (firefighters.getY() * 16),
                    (firefighters.getX() * 16) + 28, (firefighters.getY() * 16) + 28,
                    (firefighters.getX() * 16), (firefighters.getY() * 16) + 28
                });
        graphFireTruck.setAnimation(myFireTruck);
        graphFireTruck.setPolygon(myPolygon);

        return graphFireTruck;
    }

    public static GraphicablePoliceCar newPoliceCar(PoliceCar policeCar) {
        GraphicablePoliceCar graphPoliceCar = new GraphicablePoliceCar(policeCar);

        Animation myPoliceCar = AnimationFactory.getPoliceCarAnimation().copy();
        EmergencyEntityBuilding policeDepartment = CityEntities.buildings.get("Police Department");
        Polygon myPolygon = new Polygon(new float[]{
                    policeDepartment.getX() * 16, policeDepartment.getY() * 16,
                    (policeDepartment.getX() * 16) + 28, (policeDepartment.getY() * 16),
                    (policeDepartment.getX() * 16) + 28, (policeDepartment.getY() * 16) + 28,
                    (policeDepartment.getX() * 16), (policeDepartment.getY() * 16) + 28
                });
        graphPoliceCar.setAnimation(myPoliceCar);
        graphPoliceCar.setPolygon(myPolygon);

        return graphPoliceCar;
    }

    public static GraphicableHighlightedHospital newHighlightedHospital(Hospital hospital) {
        GraphicableHighlightedHospital graphHospital = new GraphicableHighlightedHospital(hospital);

        Animation myHospital = AnimationFactory.getHighlightedHospitalAnimation();

        Polygon myHospitalPolygon = new Polygon(new float[]{
                    Math.round(hospital.getX()) * 16, Math.round(hospital.getY()) * 16,
                    (Math.round(hospital.getX()) * 16) + 16, Math.round(hospital.getY()) * 16,
                    (Math.round(hospital.getX()) * 16) + 16, Math.round(hospital.getY()) * 16 + 16,
                    Math.round(hospital.getX()) * 16, Math.round(hospital.getY()) * 16 + 16
                });
        graphHospital.setAnimation(myHospital);
        graphHospital.setPolygon(myHospitalPolygon);

        return graphHospital;
    }

    public static GraphicableHighlightedFirefighterDepartment newHighlightedFirefighterDepartment(FirefightersDepartment firefightersDepartment) {
        GraphicableHighlightedFirefighterDepartment graphFirefightersDepartment = new GraphicableHighlightedFirefighterDepartment(firefightersDepartment);

        Animation myFireFighterDepartment = AnimationFactory.getHighlightedFirefighterDepartmentAnimation();

        Polygon myHospitalPolygon = new Polygon(new float[]{
                    Math.round(firefightersDepartment.getX()) * 16, Math.round(firefightersDepartment.getY()) * 16,
                    (Math.round(firefightersDepartment.getX()) * 16) + 16, Math.round(firefightersDepartment.getY()) * 16,
                    (Math.round(firefightersDepartment.getX()) * 16) + 16, Math.round(firefightersDepartment.getY()) * 16 + 16,
                    Math.round(firefightersDepartment.getX()) * 16, Math.round(firefightersDepartment.getY()) * 16 + 16
                });
        graphFirefightersDepartment.setAnimation(myFireFighterDepartment);
        graphFirefightersDepartment.setPolygon(myHospitalPolygon);

        return graphFirefightersDepartment;
    }

    public static GraphicableEmergency newGenericEmergency(Call call) {
        return newEmergency(call, EmergencyType.UNDEFINED, null);
    }

    public static GraphicableEmergency newEmergency(Call call, EmergencyType type, Integer numberOfPeople) {
        //TODO: fix this ???
        GraphicableEmergency graphEmergency = new GraphicableEmergency();

        Animation myEmergency = null;

        if (type == EmergencyType.UNDEFINED) {
            myEmergency = AnimationFactory.getGenericEmergencyAnimation();
        } else {
            myEmergency = AnimationFactory.getEmergencyAnimation(type, numberOfPeople);
        }

        Polygon myEmergencyPolygon = new Polygon(new float[]{
                    xs[call.getX()] * 16, ys[call.getY()] * 16,
                    (xs[call.getX()] * 16) + 32, ys[call.getY()] * 16,
                    (xs[call.getX()] * 16) + 32, (ys[call.getY()] * 16) + 32,
                    xs[call.getX()] * 16, (ys[call.getY()] * 16) + 32
                });
        graphEmergency.setAnimation(myEmergency);
        graphEmergency.setPolygon(myEmergencyPolygon);

        graphEmergency.setCallId(call.getId());
        graphEmergency.setCallX(call.getX());
        graphEmergency.setCallY(call.getY());

        return graphEmergency;
    }

    public static GraphicableMenuBar newMenuBar() {
        
        GraphicableMenuBar graphMenuBar = new GraphicableMenuBar();
        Animation myMenuBar = AnimationFactory.getMenuBarAnimation();
        

        Polygon myMenuBarPolygon = new Polygon(new float[]{
                    0, 432,
                    640, 432,
                    640, 480,
                    0, 480
                });
        graphMenuBar.setAnimation(myMenuBar);
        graphMenuBar.setPolygon(myMenuBarPolygon);
        
        return graphMenuBar;
    }
    
    public static GraphicableEmergencyStatus newEmergencyStatus(EmergencyType type, int total){
        GraphicableEmergencyStatus emergencyStatus = new GraphicableEmergencyStatus();
      
        
        Animation myEmergencyStatus = AnimationFactory.getEmergencyStatusAnimation(type, total, total);
        
        Polygon myEmergencyStatusPolygon = new Polygon(new float[]{
                    0 + 30 , 432 + 10,
                    0 + 30 + 143, 432 + 10,
                    0 + 30 + 143, 432 + 10 + 28,
                    0 + 30 , 432 + 10 + 28
                });
        emergencyStatus.setAnimation(myEmergencyStatus);
        emergencyStatus.setPolygon(myEmergencyStatusPolygon);
        
        return emergencyStatus;
    }
}
